// 1. 导入类型
import type { IUserLoginData, IUserQuery, IUsers, Profile } from "@/api/user"

// 2. 导入接口
import {
  login as loginApi,
  getUsers as getUsersApi, // 获取用户
  addUser as addUserApi,
  removeUser as removeUserApi,
  updateUser as updateUserApi,
  getUserInfo as getUserInfoApi
} from "@/api/user"
// 登出 1. 导入 removeToken
import { setToken, removeToken } from "@/utils/auth"
// 登出 2. 导入 tagsViewStore
import { useTagsView } from "./tagsView"
import { IRole } from "@/api/role"
// 用户管理 1. 增加 查询参数接口
export type IProfileQuery = Profile & {
  pageNum?: number
  pageSize?: number
}
export const useUserStore = defineStore("user", () => {
  const state = reactive({
    // token 3. 增加 token 字段
    token: "",

    // 用户管理 2.  定义用户列表，作为缓存
    users: [] as IUsers["users"],
    // 用户管理 3. 用户个数
    count: 0,
    // 菜单权限 1. 声明 用户角色 列表变量
    roles: [] as IRole[],
    // 菜单权限 2. 声明 用户角色 其他信息
    userInfo: {} as Profile //
  })
  // token 4. 增加 login 登录函数
  const login = async (userInfo: IUserLoginData) => {
    try {
      const { username, password } = userInfo
      const response = await loginApi({ username: username.trim(), password })
      const { data } = response
      // token 4-1. 把 token 存 pinia 中
      state.token = data.token
      //  token 4-2. 把 token 存 localStorage 中
      setToken(data.token)
    } catch (e) {
      return Promise.reject(e)
    }
  }
  // 登出 3. 使用 tagsViewStore
  const tagsViewStore = useTagsView()
  // 登出 4. 登出函数
  const logout = () => {
    // 登出 4-1. 删除 pinia token
    state.token = ""
    // 登出 4-2. 删除 localStorage Token
    removeToken()
    // 登出 4-3. tagsViewStore 所有的tags标签，都应该清空
    tagsViewStore.delAllView() // ...
  }

  // 用户管理 4. 获取全部用户
  const getAllUsers = async (params: IUserQuery) => {
    const res = await getUsersApi(params)
    const { data } = res
    state.users = data.users
    state.count = data.count
  }

  // 用户管理 5. 添加用户
  const addUser = async (data: IProfileQuery) => {
    const { pageSize, pageNum, ...params } = data
    const res = await addUserApi(params)
    if (res.code === 0) {
      getAllUsers({
        pageSize,
        pageNum
      })
    }
  }
  // 用户管理 6. 删除用户
  const removeUser = async (data: IProfileQuery) => {
    const { pageSize, pageNum, id } = data
    const res = await removeUserApi(id)
    if (res.code === 0) {
      getAllUsers({
        pageSize,
        pageNum
      })
    }
  }

  const editUser = async (data: IProfileQuery) => {
    const { pageSize, pageNum, ...params } = data
    const res = await updateUserApi(params.id, params)
    if (res.code === 0) {
      getAllUsers({
        pageSize,
        pageNum
      })
    }
  }
  // 菜单权限 3. 获取用户角色和其他信息,后台会从 校验请求头 token 返回校验信息
  const getUserInfo = async () => {
    const res = await getUserInfoApi()
    if (res.code === 0) {
      const { roles, ...info } = res.data
      // 菜单权限 2-1. 保存用户角色
      state.roles = roles
      // 菜单权限 2-2. 保存 用户角色 其他信息
      state.userInfo = info as Profile
    }
  }
  return {
    login,
    state,
    logout,
    getAllUsers,
    editUser,
    removeUser,
    addUser,
    getUserInfo
  }
})
